﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Security.Cryptography;
using JSONP_Service.ServiceCardCharging;
using Encrypt;
using System.Text;
using Dgc.BLL;
using Dgc.Model;
using Dgc.DBUtility;
using CyberVN.DBUtility;

namespace JSONP_Service
{
    public class APICardCharging
    {
        public RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

        ServicesService websv = new ServicesService();

        String clear = "";
        public static string user = System.Configuration.ConfigurationManager.AppSettings["user"];
        public static string pass = System.Configuration.ConfigurationManager.AppSettings["pass"];
        public static string partnerid = System.Configuration.ConfigurationManager.AppSettings["partnerid"];
        public static string partnercode = System.Configuration.ConfigurationManager.AppSettings["partnercode"];
        public static string publickey = System.Configuration.ConfigurationManager.AppSettings["publickey"];
        public static string privatekey = System.Configuration.ConfigurationManager.AppSettings["privatekey"];
        public int transID = int.Parse(System.Configuration.ConfigurationManager.AppSettings["transID"]);
        public static string mpin = System.Configuration.ConfigurationManager.AppSettings["mpin"];
        public static string cardlist = System.Configuration.ConfigurationManager.AppSettings["cardlist"];
        public static string carddata = System.Configuration.ConfigurationManager.AppSettings["carddata"];
        public static int successcount = 0;
        public static int totalthreadtrans = 0;
        public static bool iscomplete = false;

        public static LoginResponse loginRes;
        public APICardCharging()
        {
            //
            // TODO: Add constructor logic here
            //
        }


        public string EncryptDataRSA(string origData, string publicKey)
        {
            byte[] plaintext = System.Text.Encoding.ASCII.GetBytes(origData);


            byte[] bKey = JavaScience.opensslkey.DecodePkcs8EncPrivateKey(publicKey);


            System.Security.Cryptography.RSACryptoServiceProvider myrsa = JavaScience.opensslkey.DecodeX509PublicKey(bKey);

            byte[] encrypt = myrsa.Encrypt(plaintext, false);
            string enStr = Convert.ToBase64String(encrypt);
            return enStr;
        }


        public string DecryptDataRSA(string deData, string privateKey)
        {
            try
            {
                byte[] Databyte = Convert.FromBase64String(deData);
                byte[] privatebKEY = JavaScience.opensslkey.DecodeOpenSSLPrivateKey(privateKey);
                RSACryptoServiceProvider rsa = JavaScience.opensslkey.DecodeRSAPrivateKey(privatebKEY);

                string dataDecript = Encoding.ASCII.GetString(rsa.Decrypt(Databyte, false));
                return dataDecript;
                //return DecryptData(Databyte, key);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string EncryptDataTripdesPKCS7(string origData, string key)
        {

            byte[] tripkey = Encrypt.hexa.hexatobyte(key);
            string erro = "";
            byte[] entrip = TripleDES_Encrypt_Byte(tripkey, System.Text.Encoding.UTF8.GetBytes(origData));//Encrypt.Encrypt._EncryptTripleDes(origData, tripkey, ref erro);
            return ByteArrayToHexString(entrip);
        }

        public string EncryptDataTripdes(string origData, string key)
        {

            byte[] tripkey = Encrypt.hexa.hexatobyte(key);
            string erro = "";
            string entrip = Encrypt.Encrypt._EncryptTripleDes(origData, tripkey, ref erro);

            return entrip;
        }
        public string DecryptDataTripdes(string deData, string key)
        {
            byte[] tripkey = Encrypt.hexa.hexatobyte(key);
            string error = "";
            string detrip = Encrypt.Encrypt._DecryptTripleDes(deData, tripkey, ref error);
            return detrip;
        }
        public string login()
        {
            string result = "";
            try
            {
                loginRes = new LoginResponse();

                string encryptPass = EncryptDataRSA(pass, publickey);

                loginRes = websv.login(user, encryptPass, partnerid);


                if (loginRes.status.CompareTo("1") == 0)
                {
                    string sessionid = loginRes.sessionid;
                    string tranid = loginRes.transid;
                    string message = loginRes.message;
                    string loginstatus = loginRes.status;
                    clear = DecryptDataRSA(sessionid, privatekey);



                }
                else
                {
                    result = "Login Status: " + loginRes.status;

                }

                return clear;
            }
            catch (Exception ex)
            {
                result = "Co loi trong he thong" + ex.ToString();
                return null;
            }
        }

        public void logout(string sessid)
        {
            string sessionid = login();
            string md5hex2str = HashWithMD5(sessionid);

            byte[] cvmd52 = Convert.FromBase64String(md5hex2str);
            string md5sess = ByteArrayToHexString(cvmd52);
            LogoutResponse logoutres = new LogoutResponse();
            logoutres = websv.logout(user, partnerid, md5sess);
            Console.WriteLine("Trang thai:{0}", logoutres.status);
            Console.WriteLine("Thong bao:{0}", logoutres.message);
        }
        public void changeMpin(string sessionid)
        {

            string datetime = dateTt();
            string mpinmoi = "";
            string strTransID = partnerid.Trim() + "_" + user.Trim() + "_" + datetime.Trim() + "_" + transID;
            transID++;
            Console.WriteLine("Ma pin cu:{0}", mpin);

            Console.WriteLine("Ma pin  moi");
            mpinmoi = Console.ReadLine();
            if (mpinmoi.Length == 0)
            {
                return;
            }
            if (mpinmoi.Equals(mpin) == true)
            {
                return;
            }
            string ensess = HashWithMD5(sessionid);
            byte[] cvmd52 = Convert.FromBase64String(ensess);
            string md5sess = ByteArrayToHexString(cvmd52);

            string enoldpin = EncryptDataTripdes(mpin, sessionid);
            string ennewpin = EncryptDataTripdes(mpinmoi, sessionid);
            ChangeResponse changeRes = new ChangeResponse();
            changeRes = websv.changeMPIN(strTransID, user, partnerid, enoldpin, ennewpin, md5sess);
            Console.WriteLine("get Status:{0}", changeRes.status);
            if (changeRes.status.Equals("1"))
            {
                mpin = mpinmoi;
            }
        }
        public string dateTt()
        {

            // string formatDATE = DateTime.Now.Month + "/" + DateTime.Now.Day + "/" + DateTime.Now.Year + "/" + DateTime.Now.Hour + "." + DateTime.Now.Minute + "." + DateTime.Now.Millisecond;
            string formatDATE = DateTime.Now.ToString("dd/mm/yyyy HH:MM:ss");
            //Console.WriteLine("{0}", formatDATE);
            return formatDATE;
        }

        public void changePass(string sessionid)
        {

            string datetime = dateTt();
            string mkmoi = "";
            string strTransID = partnerid.Trim() + "_" + user.Trim() + "_" + datetime.Trim() + "_" + transID;
            transID++;

            mkmoi = Console.ReadLine();
            if (mkmoi.Length == 0)
            {
                return;
            }
            if (mkmoi.Equals(pass) == true)
            {
                return;
            }
            string ensess = HashWithMD5(sessionid);
            byte[] cvmd52 = Convert.FromBase64String(ensess);
            string md5sess = ByteArrayToHexString(cvmd52);

            string enoldpass = EncryptDataTripdes(pass, sessionid);
            string ennewpass = EncryptDataTripdes(mkmoi, sessionid);
            ChangeResponse changeRes = new ChangeResponse();
            changeRes = websv.changePassword(strTransID, user, partnerid, enoldpass, ennewpass, md5sess);
            Console.WriteLine("get Status:{0}", changeRes.status);
            if (changeRes.status.Equals("1"))
            {
                pass = mkmoi;
            }

        }
        public void checkTrain(string sessionid)
        {

            string tranid = "";
            tranid = Console.ReadLine();
            if (tranid.Length == 0 || tranid.Equals("") == true)
            {
                return;
            }
            string ensess = HashWithMD5(sessionid);
            byte[] cvmd52 = Convert.FromBase64String(ensess);
            string md5sess = ByteArrayToHexString(cvmd52);

            ChargeReponse chargres = new ChargeReponse();
            chargres = websv.getTransactionStatus(tranid, user, partnerid, md5sess);
            Console.WriteLine("status: {0}", chargres.status);

        }
        public string cardCharging(string sessionid, string carddata, string target, int UserId)
        {

            string datetime = dateTt();
            Random ran = new Random();
            string ketqua;


            string strTransID = String.Format("{0}_{1}", partnercode.Trim(), DateTime.Now.Ticks.ToString());



            //string carddata = "12345678912:123456789:10000:VNP";

            string mapin = EncryptDataTripdesPKCS7(mpin, sessionid);
            string enCard = EncryptDataTripdesPKCS7(carddata, sessionid);
            System.Security.Cryptography.MD5CryptoServiceProvider md5en = new System.Security.Cryptography.MD5CryptoServiceProvider();


            string md5hex2str = HashWithMD5(sessionid);

            byte[] cvmd52 = Convert.FromBase64String(md5hex2str);
            string md5sess = ByteArrayToHexString(cvmd52);
            ChargeReponse chargeRes = new ChargeReponse();
            try
            {
                chargeRes = websv.cardCharging(strTransID, user, partnerid, mapin, target, enCard, md5sess);
            }
            catch
            {

                chargeRes.status = "13";

            }
            if (chargeRes.status == "1")
            {
                string status = chargeRes.status;
                string message = chargeRes.message;
                string amount = chargeRes.responseamount;
                thaytro_User current_User = HttpContext.Current.Session["UserLogin"] as thaytro_User;
                System.Threading.Thread.Sleep(500);
                //ketqua = Db_card_detailBLL.NapTheDienThoai(current_User, DecryptDataTripdesPKCS7(amount, sessionid), carddata, strTransID); //"CardCharging >>>  amount: " + DecryptDataTripdesPKCS7(amount, sessionid) + " Status : " + status;
                try
                {
                    string MoneyCardValue=DecryptDataTripdesPKCS7(amount, sessionid);

                    CyberParameter[] param1 = new CyberParameter[3];
                    param1[0] = new CyberParameter("@UserId", System.Data.DbType.Int32, UserId);
                    param1[1] = new CyberParameter("@Card_Data", System.Data.DbType.String, carddata);
                    param1[2] = new CyberParameter("@MoneyCardValue", System.Data.DbType.Int32, CyberVN.DBUtility.DBConvert.ParseInt(MoneyCardValue));
                    CyberVN.DBUtility.DBHelper.ExcuteFromStoreNonQuery("sp_AddCard", param1);
                    ketqua = "Nạp tiền thành công.Tài khoản của bạn cộng thêm " + MoneyCardValue + " VNĐ";
                }
                catch (Exception)
                {
                    ketqua = "Nạp tiền không thành công,vui lòng liên hệ thaytro.vn.........";
                }
                successcount++;
            }
            else
            {
                ketqua = " CardCharging >>>  Status : " + chargeRes.status;
                switch (chargeRes.status)
                {
                    case "-1":
                        ketqua = "Thẻ đã sử dụng.Vui lòng kiểm tra lại mã thẻ";
                        break;
                    case "-2":
                        ketqua = "Thẻ đã khóa.Vui lòng kiểm tra lại mã thẻ";
                        break;
                    case "-3":
                        ketqua = "Thẻ đã hết hạn sử dụng.Vui lòng kiểm tra lại hản sữ dụng thẻ";
                        break;
                    case "-4":
                        ketqua = "Thẻ chưa được kích hoạt.Vui lòng kiểm tra lại mã thẻ hoặc liên hệ với tổng đài";
                        break;
                    case "-10":
                        ketqua = "Mã thẻ sai định dạng.Vui lòng Kiểm tra lại định dạng mã thẻ, không nhập vào các ký tự “-” trong phần mã thẻ(nếu có).";
                        break;
                    case "-12":
                        ketqua = "Thẻ không tồn tại.Vui lòng kiểm tra lại mã thẻ";
                        break;
                    case "-99":
                        ketqua = "Thẻ VMS không đúng định dạng.Vui lòng kiểm tra lại mã thẻ";
                        break;
                    case "5":
                        ketqua = "Nhập sai quá 5 lần.Vui lòng kiểm tra lại mã thẻ hoặc liên hệ với tổng đài";
                        break;
                    case "6":
                        ketqua = "Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "99":
                        ketqua = "Chưa nhận được kết quả trả về từ nhà cung cấp.Vui lòng kiểm tra lại mã thẻ hoặc liên hệ với tổng đài";
                        break;
                    case "-24":
                        ketqua = "Dữ liệu carddata không đúng.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "-11":
                        ketqua = "Nhà cung cấp không tồn tại.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "8":
                        ketqua = "Sai IP.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "3":
                        ketqua = "Sai Session.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "7":
                        ketqua = "Session hết hạn.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "4":
                        ketqua = "Thẻ không sử dụng được(Vinaphone).Vui lòng kiểm tra lại mã thẻ";
                        break;
                    case "13":
                        ketqua = "Hệ thống tạm thời bận.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "0":
                        ketqua = "Giao dịch lỗi.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "9":
                        ketqua = "Tạm thời khóa kênh nạp VMS do quá tải.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "10":
                        ketqua = "Hệ thống nhà cung cấp lỗi.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "11":
                        ketqua = "Nhà cung cấp tạm thời khóa partner do lỗi hệ thống.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "12":
                        ketqua = "Trùng transaction id. lòng liên hệ với thaytro.vn";
                        break;
                    case "16":
                        ketqua = "Giao dịch không tồn tại.Vui lòng liên hệ với thaytro.vn";
                        break;
                    case "50":
                        ketqua = "Thẻ đã sử dụng hoặc không tồn tại.Vui lòng kiểm tra lại mã thẻ";
                        break;

                }
            }
            Generic<thaytro_db_store_phone> bll = new Generic<thaytro_db_store_phone>();
            thaytro_db_store_phone obj = new thaytro_db_store_phone()
            {
                TransID = strTransID,
                Card_Data = carddata,
                SessionID = sessionid,
                Status = chargeRes.status,
                Amount = chargeRes.responseamount,
                PostDate = DateTime.Now
            };
            bll.Insert(obj);

            return ketqua;


        }
        public static string HashWithMD5(string text)
        {

            MD5CryptoServiceProvider hashAlgorithm = new MD5CryptoServiceProvider();

            return HashString(text, hashAlgorithm);

        }
        public static string HashString(string stringToHash, HashAlgorithm algo)
        {

            byte[] bytes = Encoding.UTF8.GetBytes(stringToHash);

            bytes = algo.ComputeHash(bytes);
            return Convert.ToBase64String(bytes);
        }
        private static string ByteArrayToHexString(byte[] Bytes)
        {
            StringBuilder Result = new StringBuilder();
            string HexAlphabet = "0123456789ABCDEF";

            foreach (byte B in Bytes)
            {
                Result.Append(HexAlphabet[(int)(B >> 4)]);
                Result.Append(HexAlphabet[(int)(B & 0xF)]);
            }

            return Result.ToString();
        }

        public string DecryptDataTripdesPKCS7(string origData, string key)
        {

            byte[] tripkey = Encrypt.hexa.hexatobyte(key);
            string erro = "";
            byte[] entrip = TripleDES_Decrypt_Byte(tripkey, Encrypt.hexa.hexatobyte(origData));//Encrypt.Encrypt._EncryptTripleDes(origData, tripkey, ref erro);
            return System.Text.Encoding.UTF8.GetString(entrip);
        }


        private byte[] TripleDES_Encrypt_Byte(byte[] Keys, byte[] clearText)
        {
            try
            {
                byte[] IVs = new byte[8];
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                des.IV = IVs;
                des.KeySize = 192; //24Bytes                
                des.Key = Keys;
                des.Mode = CipherMode.ECB;
                des.Padding = PaddingMode.PKCS7;
                //clearText = /System.Text.Encoding.ASCII.GetBytes()//FillBlock(clearText);
                byte[] cipherText = des.CreateEncryptor().TransformFinalBlock(clearText, 0, clearText.Length);
                return cipherText;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        private byte[] TripleDES_Decrypt_Byte(byte[] Keys, byte[] clearText)
        {
            try
            {
                byte[] IVs = new byte[8];
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                des.IV = IVs;
                des.KeySize = 192; //24Bytes                
                des.Key = Keys;
                des.Mode = CipherMode.ECB;
                des.Padding = PaddingMode.PKCS7;
                //clearText = /System.Text.Encoding.ASCII.GetBytes()//FillBlock(clearText);
                byte[] cipherText = des.CreateDecryptor().TransformFinalBlock(clearText, 0, clearText.Length);
                return cipherText;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}